using System;
using System.Security.Cryptography;

namespace libcharakter
{
	public class Wuerfel
	{
		private int m_max;
		private int m_min;

		public int Ergebniss { get { return GenerateRandomNumber(); } }

		public Wuerfel (int min, int max)
		{
			m_max = max;
			m_min = min;
		}

		private int GenerateRandomNumber()
		{
		    RNGCryptoServiceProvider c = new RNGCryptoServiceProvider();
		    // Ein integer benötigt 4 Byte
		    byte[] randomNumber = new byte[4];
		    // dann füllen wir den Array mit zufälligen Bytes
		    c.GetBytes(randomNumber);
		    // schließlich wandeln wir den Byte-Array in einen Integer um
		    int result = Math.Abs(BitConverter.ToInt32(randomNumber, 0));
		    // da bis jetzt noch keine Begrenzung der Zahlen vorgenommen wurde,
		    // wird diese Begrenzung mit einer einfachen Modulo-Rechnung hinzu-
		    // gefügt
		    return result % m_max + m_min;
		}
	}
	public class W3 : Wuerfel
	{
		public W3 () : base(1, 3) { }
	}

	public class W6 : Wuerfel
	{
		public W6 () : base(1, 6) { }
	}
	public class W20 : Wuerfel
	{
		public W20 () : base(1, 20) { }
	}

	public static class WuerfelList
	{
		private static Wuerfel[] m_wuerfel = new Wuerfel[] { new W3(), new W6(), new W20() };

		public static int GetNumber (int max)
		{
			switch (max) 
			{
			case 3: return m_wuerfel[0].Ergebniss;
			case 6: return m_wuerfel[1].Ergebniss;
			case 20: return m_wuerfel[2].Ergebniss;
			default:
				throw new Exception("unknown");
			}
		}
	}
}

